#include "AppManager.h"

AppManager::AppManager()
{
    initThread();
    _workService[0].data()->detach();
    _workService[1].data()->detach();

//    QTimer::singleShot(2000,this,[=](){



//        // CAD_model->setStringList(SysMembers::GetInstance()->cads);
//    });
}

void AppManager::initThread()
{
    _workService[0].reset(new std::thread([this](){
        /// while(_mtx.try_lock()) {    /// 当没有操作deque的时候,分解当前
        while(1){
            while(!currentStatus.error.empty()) {    /// 当有异常信息的时候
                handlerError();
            }
            sleep_s(1);
        }
    }));
    _workService[1].reset(new std::thread([this](){
        /// while(_mtx.try_lock()) {    /// 当没有操作deque的时候,分解当前
        while(1){
            while(!currentStatus.warning.empty()) {    /// 当有异常信息的时候
                handlerWarn();
            }
            sleep_s(1);
        }
    }));
}

void AppManager::handlerError()
{
    // currentStatus.error
    std::lock_guard<std::recursive_mutex> lck(_mtx);
    foreach(auto msg,currentStatus.error){
        showErrorMessage(std::get<1>(msg));
        std::cout << "handlerError:"<<std::get<0>(msg)<<std::endl;
        auto exp =std::get<1>(msg);
        switch (exp) {
        case MU_ERROR_MODULE_ROBOT:
            currentStatus.expLock.store(2);
            break;
        case MU_ERROR_MODULE_WELD:
            currentStatus.expLock.store(2); //A
            /*
                **Todo
                ** A.停止机器人的连续运动模式
                ** B.关闭焊机
                ** C.写入到异常日志模块
                ** D.
            */

            break;
        default:
            break;
        }
        /// 终止其他线程的异常
        /// 如果是PLC,相机 变位机 激光 图像等则为2
        if(MU_ERROR_MODULE_ROBOT != std::get<1>(msg)){
            currentStatus.expLock.store(2);
        }else {
            currentStatus.expLock.store(6);
        }
        reportExp(std::get<2>(msg)+"\t----\t"+std::get<0>(msg));
        /// 如果是机器人故障，则为>5
        if(-1000 > (std::get<1>(msg))){
            UC2 _task = MU_TASK_INDEX_CAM | MU_TASK_INDEX_PLC | MU_TASK_INDEX_WELD | MU_TASK_INDEX_ROBOT;
            _task &= (~(std::get<1>(msg)));
            task.stopATasks(_task);
        }

        /**/
        currentStatus.error.pop_front();
    }

}

void AppManager::handlerWarn()
{
    std::lock_guard<std::recursive_mutex> lck(_mtx);
    foreach(auto msg,currentStatus.warning){
        reportWarn(std::get<2>(msg)+"\t----\t"+std::get<0>(msg));
        currentStatus.warning.pop_front();
    }
}

void AppManager::showErrorMessage(MU_E_TYPE &msg)
{
    std::cout << MU_Get_Msg(msg)<<std::endl;
}
